package info.hexin.json;

import info.hexin.json.parser.DefaultJsonParer;
import info.hexin.json.parser.JSONTokener;
import info.hexin.json.serialize.JsonRender;
import info.hexin.json.serialize.JsonSerializeConfig;
import info.hexin.json.serialize.StringWrite;
import info.hexin.lang.Exceptions;
import info.hexin.lang.reflect.Wrap;

/**
 * json工具类
 * 
 * @author hexin
 * 
 */
public class Json {
    /**
     * 将object转化成json
     * 
     * @param obj
     * @return
     */
    public static String toJson(Object obj) {
        StringWrite write = new StringWrite();
        Class<?> clazz = obj.getClass();
        JsonRender render = JsonSerializeConfig.getRender(clazz);
        render.render(obj, write);
        return write.toString();
    }

    /**
     * 将json转化成map 或者list
     * 
     * @param json
     * @return
     */
    public static <T> T fromJson(String json) {
        DefaultJsonParer jsonParer = new DefaultJsonParer(new JSONTokener(json));
        return jsonParer.parser();
    }

    /**
     * 将json转化成指定的class，前提是json和class的属性要能对应上
     * 
     * @param json
     * @param t
     * @return
     */
    public static <T> T fromJson(String json, Class<T> t) {
        DefaultJsonParer jsonParer = new DefaultJsonParer(new JSONTokener(json));
        Object obj = jsonParer.parser();
        try {
            if (obj.getClass() == t || t.isInstance(obj)) {
                return t.cast(obj);
            } else {
                return Wrap.maplist2Object(obj, t);
            }
        } catch (Exception e) {
            throw Exceptions.make(e);
        }
    }
}
